package com.example.mysql.学习笔记.高级.事务.锁.锁的分类;

public class 从加锁方式划分隐式锁显示锁 {
}
/**
 * 1.隐式锁   一般用于插入
 * 一个事务在执行INSERT操作时，如果即将插入的间隙已经被其他事务加了gap锁,
 * 那么本次INSERT操作会阻塞，并且当前事务会在该间隙上加一个插入意向锁，
 * 否则-般情况下INSERT操作是不加锁的。
 * 那如果一个事务首先插入了一条记录(此时并没有在内存生产与该记录关联的锁结构)，
 *
 * ●情景一:对于聚簇索引记录来说，有一个trx_id隐藏列，
 * 该隐藏列记录着最后改动该记录的事务id，
 *
 * 当某一个事务准备操作的时候，会查看隐藏列记录的事务是否是活跃状态，
 * 如果是活跃状态，那么此事务会帮助 隐藏列记录的事务  构建一个锁结构
 *  锁结构的第9个比特位是0  是个false  表示占用锁
 *  他在给自己也创一个锁结构  9个比特位是1  是个true
 *  等到第一个事务结束了  自己的改成false
 *
 * ●情景二:对于二级索引记录来说，本身并没有trx_id隐藏列，
 * 但是在二级索引页面的Page Header部分有一个PAGE_MAX_TRX_ID属性，
 * 该属性代表对该页面做改动的最大的事务id,如果PAGE_MAX_TRX_ID属性值
 * 小于当前最小的活跃事务id，那么说明对该页面做修改的事务都已经提交了，
 * 否则就需要在页面中定位到对应的二级索引记录，
 * 然后回表找到它对应的聚簇索引记录，然后再重复 情景一的做法。
 *
 * 即:一个事务对新插入的记录可以不显式的加锁(生成一个锁结构) ，
 * 但是由于事务id的存在,相当于加了一个隐式锁。
 * 别的事务在对这条记录加S锁或者X锁时，由于隐式锁的存在，会先帮助当前事务生成一个锁结构,
 * 然后自己再生成一个锁结构后进入等待状态。
 * 隐式锁是一种延迟加锁的机制，从而来减少加锁的数量。
 * 隐式锁在实际内存对象中并不含有这个锁信息。
 *
 * 只有当产生锁等待时，隐式锁转化为显式锁。
 *
 */
/**
 * 其他的都是显示锁
 */